﻿Imports System.IO
Imports System.Data
Imports MetodosComuns
Imports extranet.BC
Imports extranet.BE
Imports System.Collections.Generic
Imports EnhancedFileUpload

Partial Class AdministracaoAcessos_AdmAcsUsuarios
  Inherits System.Web.UI.Page

  Private Const DEBUG As Boolean = False
  ' Inicializar parâmetros da Página
  Private Const TITULO_PAGINA As String = "Usuários do Sistema"
  Private Const TITULO_REGISTROS As String = "USUÁRIOS CADASTRADOS"
  Private Const TITULO_REGISTRO_DETALHE As String = "DETALHES DO USUÁRIO DO SISTEMA"
  Private Const TITULO_REGISTRO_EDICAO As String = "ALTERAR USUÁRIO DO SISTEMA"
  Private Const TITULO_REGISTRO_CADASTRO As String = "CADASTRO DE USUÁRIO DO SISTEMA"
  Private Const MESSAGE_INSERIDO_COM_SUCESSO As String = "O Usuário do Sistema foi Cadastrado com Sucesso!"
  Private Const MESSAGE_ALTERADO_COM_SUCESSO As String = "O Usuário do Sistema foi Alterado com Sucesso!"
  Private Const MESSAGE_EXCLUIDO_COM_SUCESSO As String = "O Usuário do Sistema foi Excluído com Sucesso!"
  Private Const MESSAGE_ERRO_NA_INSERCAO As String = "Erro na inserção do Registro!."
  Private Const MESSAGE_ERRO_NA_ALTERACAO As String = "Erro na atualização do Registro!."
  Private Const MESSAGE_ERRO_NA_EXCLUSAO As String = "Erro na exclusão do Registro!."

  Private Const ROW_NOME_USUARIO As Integer = 0
  Private Const ROW_AVATAR As Integer = 1
  Private Const ROW_CPF As Integer = 2
  Private Const ROW_EMAIL As Integer = 3
  Private Const ROW_FRANQUIA As Integer = 4
  Private Const ROW_USUARIO As Integer = 5
  Private Const ROW_SENHA As Integer = 6
  Private Const ROW_SENHA_CONFIRMACAO As Integer = 7
  Private Const ROW_GRUPOACESSO As Integer = 8
  Private Const ROW_PAIS As Integer = 9
  Private Const ROW_CEP As Integer = 10
  Private Const ROW_UF As Integer = 11
  Private Const ROW_CIDADE As Integer = 12
  Private Const ROW_LOGRADOURO As Integer = 13

  Private Const SORT_INDICE_ARRAY As Integer = 0
  Private Const SORT_REGISTROS As Integer = 0

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    '==================       PROCEDIMENTO  PADRÃO  SEGURANÇA     =============================
    Dim objBESeguranca As BESeguranca
    Dim objBEUsuario As BEUsuario = Session("objBEUsuario")
    If IsNothing(objBEUsuario) Then Response.Redirect(TELA_LOGOUT)
    Session("strTela") = MetodosComuns.GetCurrentPageName()
    If Not IsPostBack Then          ' SEGURANÇA
      objBESeguranca = BCSeguranca.SelecionaPermissoes(objBEUsuario.GrupoAcesso, Session("strTela"))
      If Not objBESeguranca.Autorizado Then Response.Redirect(TELA_LOGOUT)
      Session("objBESeguranca") = objBESeguranca
    Else
      objBESeguranca = Session("objBESeguranca")
    End If

    '==================       ALTERAR SE FOR NECESSARIO          ===============================
    If Not IsPostBack Then
      Dim sortExpression(SORT_INDICE_ARRAY) As String
      Dim sortDirection(SORT_INDICE_ARRAY) As String
      Session(Session("strTela") & "_SortExpression") = sortExpression
      Session(Session("strTela") & "_SortDirection") = sortDirection

      lblTituloCadastro.Text = TITULO_PAGINA
      With objBESeguranca
        If Not .Escrita Then btnCadastrar.Visible = False
      End With
      mostraPaineis(ESTADO_INICIAL)
    End If

  End Sub

  Protected Sub mostraMensagemDeErro(ByVal message As String)
    lblErro.Visible = True
    lblErro.Text = message
  End Sub

  Protected Sub mostraPaineis(ByVal estado As Int16, ByVal message As String)
    mostraPaineis(estado)
    lblSucesso.Visible = True
    lblSucesso.Text = message
  End Sub

  Protected Sub mostraPaineisComErro(ByVal estado As Int16, ByVal message As String)
    mostraPaineis(estado)
    lblErro.Visible = True
    lblErro.Text = message
  End Sub

  Protected Sub mostraPaineis(ByVal estado As Int16)
    Dim objBESeguranca As BESeguranca = DirectCast(Session("objBESeguranca"), BESeguranca)
    lblSucesso.Visible = False
    lblErro.Visible = False

    ' SEGURANÇA
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        If Not objBESeguranca.Leitura Then estado = IIf(objBESeguranca.Escrita, ESTADO_CADASTRO, ESTADO_BLOQUEADO)
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
        If Not objBESeguranca.Escrita Then estado = IIf(objBESeguranca.Leitura, ESTADO_LISTA, ESTADO_BLOQUEADO)
    End Select

    ' Set Título do painel
    setTitulo(estado)

    ' Set Indice do Registro selecionado na lista de Registros
    grvRegistros.Enabled = (Not estado = ESTADO_BLOQUEADO)
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        grvRegistros.SelectedIndex = -1
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
        grvRegistros.SelectedIndex = -1
    End Select

    ' Set o estado do Data View
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        dtvRegistro.ChangeMode(DetailsViewMode.ReadOnly)
      Case ESTADO_DETALHE
        dtvRegistro.ChangeMode(DetailsViewMode.ReadOnly)
      Case ESTADO_EDICAO
        dtvRegistro.ChangeMode(DetailsViewMode.Edit)
      Case ESTADO_CADASTRO
        dtvRegistro.ChangeMode(DetailsViewMode.Insert)
    End Select

    ' Mostra Painel segundo o estado
    If Not DEBUG Then
      Select Case estado
        Case ESTADO_BLOQUEADO
          panBuscaRegistro.Visible = False
          pangrvRegistros.Visible = False
          pandtvRegistro.Visible = False
        Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
          panBuscaRegistro.Visible = True
          pangrvRegistros.Visible = True
          pandtvRegistro.Visible = False
        Case ESTADO_DETALHE, ESTADO_EDICAO, ESTADO_CADASTRO
          panBuscaRegistro.Visible = False
          pangrvRegistros.Visible = False
          pandtvRegistro.Visible = True
      End Select
    Else
      panBuscaRegistro.Visible = True
      pangrvRegistros.Visible = True
      pandtvRegistro.Visible = True
    End If

    ' Set Registro(s) segundo o estado
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        mostraRegistros()
      Case ESTADO_DETALHE, ESTADO_EDICAO
        mostraRegistro()
      Case ESTADO_CADASTRO
    End Select

    ' Set Focus segundo o Estado
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        scriptManager.SetFocus(txtNome)
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
    End Select

  End Sub

  Protected Sub setTitulo(ByVal estado As Int16)
    ' Set Título do painel
    Select Case estado
      Case ESTADO_BLOQUEADO, ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        grvRegistros.Caption = TITULO_REGISTROS
      Case ESTADO_DETALHE
        dtvRegistro.Caption = TITULO_REGISTRO_DETALHE
      Case ESTADO_EDICAO
        dtvRegistro.Caption = TITULO_REGISTRO_EDICAO
      Case ESTADO_CADASTRO
        dtvRegistro.Caption = TITULO_REGISTRO_CADASTRO
    End Select
  End Sub

  Protected Sub btnBuscar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub btnCadastrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCadastrar.Click
    mostraPaineis(ESTADO_CADASTRO)
  End Sub

  Protected Sub grvRegistros_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grvRegistros.PageIndexChanging
    grvRegistros.PageIndex = e.NewPageIndex
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub grvRegistros_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grvRegistros.Sorting
    setSorting(SORT_REGISTROS, e)
    e.Cancel = True
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub grvRegistros_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles grvRegistros.SelectedIndexChanged
    mostraPaineis(ESTADO_DETALHE)
  End Sub

  Protected Sub finalizaConsultaItem(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub btnAlterar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_EDICAO)
  End Sub

  Protected Sub btnCancelarAlteracao_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_DETALHE)
  End Sub

  Protected Sub btnCancelarCadastro_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_INICIAL)
  End Sub

  Protected Property IsInEditMode() As Boolean
    Get
      Return Not (dtvRegistro.CurrentMode = DetailsViewMode.ReadOnly)
    End Get
    Set(ByVal value As Boolean)
    End Set
  End Property

  Protected Sub dtvRegistro_ModeChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewModeEventArgs) Handles dtvRegistro.ModeChanging
    e.NewMode = dtvRegistro.CurrentMode
  End Sub

  Protected Sub dtvRegistro_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtvRegistro.DataBound
    Dim objBESeguranca As BESeguranca = DirectCast(Session("objBESeguranca"), BESeguranca)
    Dim mc As New MetodosComuns
    dtvRegistro.Fields(ROW_SENHA).Visible = True
    dtvRegistro.Fields(ROW_SENHA_CONFIRMACAO).Visible = True
    Select Case dtvRegistro.CurrentMode

      Case DetailsViewMode.Insert         ' MODO de INSERÇÃO
        If Not objBESeguranca.Leitura Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnCancelarCadastro").Visible = False
        scriptManager.SetFocus(dtvRegistro.Rows(0).FindControl("txt_nome"))
        setTitulo(ESTADO_CADASTRO)

      Case DetailsViewMode.Edit           ' MODO de EDIÇÃO
        scriptManager.SetFocus(dtvRegistro.Rows(0).FindControl("txt_nome"))
        setTitulo(ESTADO_EDICAO)

      Case DetailsViewMode.ReadOnly       ' MODO de LEITURA
        With objBESeguranca
          If dtvRegistro.Rows.Count Then
            If Not .Exclusao Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnExcluir").Visible = False
            If Not .Modificacao Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnAlterar").Visible = False
          End If
        End With
        If (dtvRegistro.Rows.Count > 0) Then
          scriptManager.SetFocus(dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnOk"))
        End If
        dtvRegistro.Fields(ROW_SENHA).Visible = False
        dtvRegistro.Fields(ROW_SENHA_CONFIRMACAO).Visible = False
        setTitulo(ESTADO_DETALHE)

    End Select
  End Sub

  Protected Sub ddl_Franquia_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    DirectCast(sender, DropDownList).DataSource = BCFranquia.Selecionar()
  End Sub

  Protected Sub ddl_GrupoAcesso_Init(ByVal sender As Object, ByVal e As System.EventArgs)
    DirectCast(sender, DropDownList).DataSource = BCGrupoAcesso.Selecionar()
  End Sub

  Protected Sub dtvRegistro_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles dtvRegistro.ItemInserting
    If verificaInformacao() AndAlso processaRegistro() Then dtvRegistro_ItemInserted(sender, Nothing)
  End Sub

  Protected Sub dtvRegistro_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles dtvRegistro.ItemInserted
    If e IsNot Nothing Then e.ExceptionHandled = True
    mostraPaineis(ESTADO_INICIAL, MESSAGE_INSERIDO_COM_SUCESSO)
  End Sub

  Protected Sub dtvRegistro_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles dtvRegistro.ItemUpdating
    If verificaInformacao() AndAlso processaRegistro() Then dtvRegistro_ItemUpdated(sender, Nothing)
  End Sub

  Protected Sub dtvRegistro_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) Handles dtvRegistro.ItemUpdated
    Dim strNome As String = txtNome.Text
    If e IsNot Nothing Then e.ExceptionHandled = True
    If (LocalizaStringsNoTexto(strNome, DirectCast(dtvRegistro.Rows(ROW_NOME_USUARIO).FindControl("txt_nome"), TextBox).Text)) Then
      mostraPaineis(ESTADO_DETALHE, MESSAGE_ALTERADO_COM_SUCESSO)
    Else
      mostraPaineis(ESTADO_LISTA, MESSAGE_ALTERADO_COM_SUCESSO)
    End If
  End Sub

  Protected Sub dtvRegistro_ItemDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewDeleteEventArgs) Handles dtvRegistro.ItemDeleting
    Try
      BCUsuario.Excluir(New BEUsuario(dtvRegistro.DataKey("Usuario"), Nothing))
      dtvRegistro_ItemDeleted(sender, Nothing)
    Catch ex As Exception
      mostraPaineisComErro(ESTADO_DETALHE, MESSAGE_ERRO_NA_EXCLUSAO)
    End Try
  End Sub

  Protected Sub dtvRegistro_ItemDeleted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewDeletedEventArgs) Handles dtvRegistro.ItemDeleted
    If e IsNot Nothing Then e.ExceptionHandled = True
    mostraPaineis(ESTADO_LISTA, MESSAGE_EXCLUIDO_COM_SUCESSO)
  End Sub

  Protected Sub mostraRegistros()
    grvRegistros.DataSource = BCUsuario.Selecionar(txtNome.Text, _
                                                   Session(Session("strTela") & "_SortExpression")(SORT_REGISTROS), _
                                                   Session(Session("strTela") & "_SortDirection")(SORT_REGISTROS))
    grvRegistros.DataBind()
  End Sub

  Protected Sub mostraRegistro()
    dtvRegistro.DataSource = BCUsuario.Selecionar(grvRegistros.SelectedDataKey("Usuario"))
    dtvRegistro.DataBind()
    setTrigger()
  End Sub

  Protected Sub setTrigger()
    Dim trigger As New PostBackTrigger()
    Dim scm As ScriptManager = scriptManager.GetCurrent(Me.Page)
    Dim ctrl As Control
    If Not dtvRegistro.CurrentMode = FormViewMode.ReadOnly Then
      ctrl = dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl(IIf(dtvRegistro.CurrentMode = FormViewMode.Insert, "btnCadastrar", "btnAtualizar"))
      trigger.ControlID = ctrl.ClientID
      updPanel.Triggers.Add(trigger)
      scm.RegisterPostBackControl(ctrl)
    End If
  End Sub

  Protected Function verificaInformacao() As Boolean
    Dim strNovaSenha1 As String = DirectCast(dtvRegistro.Rows(ROW_SENHA).FindControl("txt_Senha1"), TextBox).Text
    Dim strNovaSenha2 As String = DirectCast(dtvRegistro.Rows(ROW_SENHA_CONFIRMACAO).FindControl("txt_Senha2"), TextBox).Text
    Dim boolProcessa As Boolean = (strNovaSenha1.Equals(strNovaSenha2))
    If Not boolProcessa Then
      mostraMensagemDeErro("As senhas digitadas não são iguais")
      setTrigger()
    End If
    Return boolProcessa
  End Function

  Protected Function processaRegistro() As Boolean
    Dim boolInsercao As Boolean = (dtvRegistro.CurrentMode = DetailsViewMode.Insert)
    Dim usuario As New BEUsuario()
    Dim booSucesso As Boolean = True
    Try
      Dim iuAvatar As ImageUpload = dtvRegistro.Rows(ROW_AVATAR).FindControl("iu_Avatar")
      Dim strAvatar As String = ""
      Dim booLimpaAvatar As Boolean = False
      If Not boolInsercao Then
        strAvatar = DirectCast(dtvRegistro.Rows(ROW_AVATAR).FindControl("lbl_Avatar"), Label).Text
        booLimpaAvatar = DirectCast(dtvRegistro.FindControl("cb_ExcluirAvatar"), CheckBox).Checked
      End If
      If iuAvatar.HasFile Then
        iuAvatar.saveImage()
        If Not iuAvatar.ImageName = strAvatar AndAlso strAvatar.Length > 0 Then _
           File.Delete(HttpContext.Current.Server.MapPath("~/imagens/avatar/") & strAvatar)
        strAvatar = iuAvatar.ImageName
      ElseIf booLimpaAvatar AndAlso strAvatar.Length > 0 Then
        File.Delete(HttpContext.Current.Server.MapPath("~/imagens/avatar/") & strAvatar)
        strAvatar = ""
      End If

      With usuario
        .Usuario = DirectCast(dtvRegistro.Rows(ROW_USUARIO).FindControl("txt_Usuario"), TextBox).Text
        .Nome = DirectCast(dtvRegistro.Rows(ROW_NOME_USUARIO).FindControl("txt_Nome"), TextBox).Text
        .Avatar = strAvatar
        .Cpf = DirectCast(dtvRegistro.Rows(ROW_CPF).FindControl("txt_Cpf"), TextBox).Text
        .Franquia = New BEFranquia(Integer.Parse(DirectCast(dtvRegistro.Rows(ROW_FRANQUIA).FindControl("ddl_Franquia"), DropDownList).SelectedValue))
        .GrupoAcesso = New BEGrupoAcesso(Integer.Parse(DirectCast(dtvRegistro.Rows(ROW_GRUPOACESSO).FindControl("ddl_GrupoAcesso"), DropDownList).SelectedValue))
        .Pais = DirectCast(dtvRegistro.Rows(ROW_PAIS).FindControl("txt_Pais"), TextBox).Text
        .Uf = DirectCast(dtvRegistro.Rows(ROW_UF).FindControl("ddl_Uf"), DropDownList).SelectedValue
        .Cidade = DirectCast(dtvRegistro.Rows(ROW_CIDADE).FindControl("txt_Cidade"), TextBox).Text
        .Cep = DirectCast(dtvRegistro.Rows(ROW_CEP).FindControl("txt_Cep"), TextBox).Text
        .Logradouro = DirectCast(dtvRegistro.Rows(ROW_LOGRADOURO).FindControl("txt_Logradouro"), TextBox).Text
        .Email = DirectCast(dtvRegistro.Rows(ROW_EMAIL).FindControl("txt_Email"), TextBox).Text
      End With
      If boolInsercao Then
        BCUsuario.Cadastrar(usuario)
      Else
        BCUsuario.Atualizar(usuario)
      End If
      Session("objBEUsuario") = usuario

      usuario.Senha = DirectCast(dtvRegistro.Rows(ROW_SENHA).FindControl("txt_Senha1"), TextBox).Text
      If usuario.Senha.Length > 0 Then BCUsuario.AtualizarSenha(usuario)
    Catch ex As Exception
      mostraMensagemDeErro(IIf(boolInsercao, MESSAGE_ERRO_NA_INSERCAO, MESSAGE_ERRO_NA_ALTERACAO))
      booSucesso = False
      setTrigger()
    End Try
    Return booSucesso
  End Function

  '=========****************                                     ****************=========

  Protected Sub setSorting(ByVal intTipo As Integer, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs)
    If (Session(Session("strTela") & "_SortExpression")(intTipo) Is Nothing OrElse _
        Session(Session("strTela") & "_SortDirection")(intTipo) Is Nothing OrElse _
        Session(Session("strTela") & "_SortExpression")(intTipo) <> e.SortExpression OrElse _
        Session(Session("strTela") & "_SortDirection")(intTipo) = "DESC") Then
      Session(Session("strTela") & "_SortDirection")(intTipo) = "ASC"
    ElseIf Session(Session("strTela") & "_SortDirection")(intTipo) = "ASC" Then
      Session(Session("strTela") & "_SortDirection")(intTipo) = "DESC"
    End If
    Session(Session("strTela") & "_SortExpression")(intTipo) = e.SortExpression
  End Sub

End Class
